package com.lanmaoly.cunzheng.thread;

import java.util.ArrayList;
import java.util.List;

public class ListAdd1 {
    //list集合
    public volatile List list = new ArrayList<>();

    //添加元素的方法
    public void add() {
        list.add("wendao");
    }

    //获取集合大小的方法
    public int size() {
        return list.size();
    }

    public static void main(String[] args) throws Exception {

        final ListAdd1 add1 = new ListAdd1();

        Thread thread1 = new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized (add1) {
                    for (int i = 0; i < 10; i++) {
                        add1.add();
                        System.out.println(Thread.currentThread().getName() + "添加了第" + i + "元素");
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        if (add1.size() == 5) {
                            try {
                                //先通知再等待，
                                add1.notify();
                                add1.wait();
                                //先等待在通知是不行的因为wait是阻塞方法
                                //add1.wait();
                                //add1.notify();
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }

            }
        }, "t1");

        Thread thread2 = new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    synchronized (add1) {
                        try {
                            //等待线程1的信号
                            System.out.println("释放" + Thread.currentThread().getName());
                            add1.wait();
                            System.out.println("终止当前线程" + Thread.currentThread().getName());
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        //给线程1发送信号
                        System.out.println("给线程1发送信号" + Thread.currentThread().getName());
                        add1.notify();
                        break;
                    }

                }

            }
        }, "t2");

        thread2.start();
        //睡眠的目的保证线程2先抢到锁，先执行，线程2一旦wait会立马释放锁，线程1抢到锁后执行
        Thread.sleep(10);
        thread1.start();
    }

}
